First half of support for N3657; heterogenous lookups for set/multiset git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@188241 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/set b/include/set index d714c1a..70b8d28 100644 --- a/include/set +++ b/include/set 
@@ -129,13 +129,33 @@  // set operations:  iterator find(const key_type& k);  const_iterator find(const key_type& k) const; + template<typename K> + iterator find(const K& x); + template<typename K> + const_iterator find(const K& x) const; // C++14 + template<typename K> + size_type count(const K& x) const; // C++14 +  size_type count(const key_type& k) const;  iterator lower_bound(const key_type& k);  const_iterator lower_bound(const key_type& k) const; + template<typename K> + iterator lower_bound(const K& x); // C++14 + template<typename K> + const_iterator lower_bound(const K& x) const; // C++14 +  iterator upper_bound(const key_type& k);  const_iterator upper_bound(const key_type& k) const; + template<typename K> + iterator upper_bound(const K& x); // C++14 + template<typename K> + const_iterator upper_bound(const K& x) const; // C++14  pair<iterator,iterator> equal_range(const key_type& k);  pair<const_iterator,const_iterator> equal_range(const key_type& k) const; + template<typename K> + pair<iterator,iterator> equal_range(const K& x); // C++14 + template<typename K> + pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14  };    template <class Key, class Compare, class Allocator> @@ -285,13 +305,32 @@  // set operations:  iterator find(const key_type& k);  const_iterator find(const key_type& k) const; + template<typename K> + iterator find(const K& x); + template<typename K> + const_iterator find(const K& x) const; // C++14 +  size_type count(const key_type& k) const;  iterator lower_bound(const key_type& k);  const_iterator lower_bound(const key_type& k) const; + template<typename K> + iterator lower_bound(const K& x); // C++14 + template<typename K> + const_iterator lower_bound(const K& x) const; // C++14 +  iterator upper_bound(const key_type& k);  const_iterator upper_bound(const key_type& k) const; + template<typename K> + iterator upper_bound(const K& x); // C++14 + template<typename K> + const_iterator upper_bound(const K& x) const; // C++14 +  pair<iterator,iterator> equal_range(const key_type& k);  pair<const_iterator,const_iterator> equal_range(const key_type& k) const; + template<typename K> + pair<iterator,iterator> equal_range(const K& x); // C++14 + template<typename K> + pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14  };    template <class Key, class Compare, class Allocator> @@ -579,6 +618,17 @@  iterator find(const key_type& __k) {return __tree_.find(__k);}  _LIBCPP_INLINE_VISIBILITY  const_iterator find(const key_type& __k) const {return __tree_.find(__k);} +#if _LIBCPP_STD_VER > 11 + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type + find(const _K2& __k) {return __tree_.find(__k);} + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type + find(const _K2& __k) const {return __tree_.find(__k);} +#endif +  _LIBCPP_INLINE_VISIBILITY  size_type count(const key_type& __k) const  {return __tree_.__count_unique(__k);} @@ -588,18 +638,51 @@  _LIBCPP_INLINE_VISIBILITY  const_iterator lower_bound(const key_type& __k) const  {return __tree_.lower_bound(__k);} +#if _LIBCPP_STD_VER > 11 + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type + lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} + + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type + lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} +#endif +  _LIBCPP_INLINE_VISIBILITY  iterator upper_bound(const key_type& __k)  {return __tree_.upper_bound(__k);}  _LIBCPP_INLINE_VISIBILITY  const_iterator upper_bound(const key_type& __k) const  {return __tree_.upper_bound(__k);} +#if _LIBCPP_STD_VER > 11 + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type + upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type + upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} +#endif +  _LIBCPP_INLINE_VISIBILITY  pair<iterator,iterator> equal_range(const key_type& __k)  {return __tree_.__equal_range_unique(__k);}  _LIBCPP_INLINE_VISIBILITY  pair<const_iterator,const_iterator> equal_range(const key_type& __k) const  {return __tree_.__equal_range_unique(__k);} +#if _LIBCPP_STD_VER > 11 + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type + equal_range(const _K2& __k) {return __tree_.__equal_range_unique(__k);} + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type + equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);} +#endif  };    #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -917,27 +1000,72 @@  iterator find(const key_type& __k) {return __tree_.find(__k);}  _LIBCPP_INLINE_VISIBILITY  const_iterator find(const key_type& __k) const {return __tree_.find(__k);} +#if _LIBCPP_STD_VER > 11 + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type + find(const _K2& __k) {return __tree_.find(__k);} + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type + find(const _K2& __k) const {return __tree_.find(__k);} +#endif +  _LIBCPP_INLINE_VISIBILITY  size_type count(const key_type& __k) const  {return __tree_.__count_multi(__k);} +  _LIBCPP_INLINE_VISIBILITY  iterator lower_bound(const key_type& __k)  {return __tree_.lower_bound(__k);}  _LIBCPP_INLINE_VISIBILITY  const_iterator lower_bound(const key_type& __k) const  {return __tree_.lower_bound(__k);} +#if _LIBCPP_STD_VER > 11 + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type + lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} + + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type + lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} +#endif +  _LIBCPP_INLINE_VISIBILITY  iterator upper_bound(const key_type& __k)  {return __tree_.upper_bound(__k);}  _LIBCPP_INLINE_VISIBILITY  const_iterator upper_bound(const key_type& __k) const  {return __tree_.upper_bound(__k);} +#if _LIBCPP_STD_VER > 11 + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type + upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type + upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} +#endif +  _LIBCPP_INLINE_VISIBILITY  pair<iterator,iterator> equal_range(const key_type& __k)  {return __tree_.__equal_range_multi(__k);}  _LIBCPP_INLINE_VISIBILITY  pair<const_iterator,const_iterator> equal_range(const key_type& __k) const  {return __tree_.__equal_range_multi(__k);} +#if _LIBCPP_STD_VER > 11 + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type + equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} + template <typename _K2> + _LIBCPP_INLINE_VISIBILITY + typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type + equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} +#endif  };    #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES